builder: Fix handling of <binding>
authorMatthias Clasen <mclasen@redhat.com>
Tue, 28 Sep 2021 17:47:15 +0000 (13:47 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 28 Sep 2021 19:09:49 +0000 (15:09 -0400)
We were only applying <binding> elements when the
object is constructed, which can be triggered by
various things (e.g. a <style> element). Defer
this until we reach </object>, so we can be sure
that we pick up all the bindings.

Testcase included.

Fixes: #4147
gtk/gtkbuilder.c
gtk/gtkbuilderparser.c
gtk/gtkbuilderprivate.h
testsuite/reftests/late-binding.ref.ui [new file with mode: 0644]
testsuite/reftests/late-binding.ui [new file with mode: 0644]
testsuite/reftests/meson.build

index 47af4df1fe6ad396aa9619bbc20a863e5bf38506..fef468e8bb2e60c01160da0659ea078700ba387c 100644 (file)
@@ -699,7 +699,7 @@ _gtk_builder_add_object (GtkBuilder  *builder,
   g_hash_table_insert (priv->objects, g_strdup (id), g_object_ref (object));
 }
 
-static void
+void
 gtk_builder_take_bindings (GtkBuilder *builder,
                            GObject    *target,
                            GSList     *bindings)
@@ -926,9 +926,6 @@ _gtk_builder_construct (GtkBuilder  *builder,
 
   object_properties_destroy (&parameters);
 
-  if (info->bindings)
-    gtk_builder_take_bindings (builder, obj, info->bindings);
-
   /* put it in the hash table. */
   _gtk_builder_add_object (builder, info->id, obj);
 
index f91523d5987cf9f434c695f446131eabfde1c2f4..ccfb1cbc565a53bcfd946a8bbea26e4edbf19961 100644 (file)
@@ -1962,6 +1962,12 @@ end_element (GtkBuildableParseContext  *context,
           object_info->signals = NULL;
         }
 
+      if (object_info->bindings)
+        {
+          gtk_builder_take_bindings (data->builder, object_info->object, object_info->bindings);
+          object_info->bindings = NULL;
+        }
+
       free_object_info (object_info);
     }
   else if (strcmp (element_name, "child") == 0)
index 32cb470f4b89867ccb46f1be96b4ec4541ad46fd..e99b7163e689d53b832d42c9f499927a7f2280bc 100644 (file)
@@ -221,6 +221,10 @@ void      _gtk_builder_add (GtkBuilder *builder,
                             ChildInfo *child_info);
 void      _gtk_builder_add_signals (GtkBuilder *builder,
                                     GPtrArray  *signals);
+void       gtk_builder_take_bindings (GtkBuilder *builder,
+                                      GObject    *target,
+                                      GSList     *bindings);
+
 gboolean  _gtk_builder_finish (GtkBuilder  *builder,
                                GError     **error);
 void _free_signal_info (SignalInfo *info,
diff --git a/testsuite/reftests/late-binding.ref.ui b/testsuite/reftests/late-binding.ref.ui
new file mode 100644 (file)
index 0000000..bcd5043
--- /dev/null
@@ -0,0 +1,18 @@
+<interface>
+  <object class="GtkWindow" id="window">
+    <child>
+      <object class="GtkLabel">
+        <property name="xalign">0.0</property>
+        <binding name="label">
+          <lookup name="label">label2</lookup>
+        </binding>
+        <style>
+          <class name="bold" />
+        </style>
+      </object>
+    </child>
+  </object>
+  <object class="GtkLabel" id="label2">
+    <property name="label">Bla</property>
+  </object>
+</interface>
diff --git a/testsuite/reftests/late-binding.ui b/testsuite/reftests/late-binding.ui
new file mode 100644 (file)
index 0000000..f710d56
--- /dev/null
@@ -0,0 +1,18 @@
+<interface>
+  <object class="GtkWindow" id="window">
+    <child>
+      <object class="GtkLabel">
+        <style>
+          <class name="bold" />
+        </style>
+        <property name="xalign">0.0</property>
+        <binding name="label">
+          <lookup name="label">label2</lookup>
+        </binding>
+      </object>
+    </child>
+  </object>
+  <object class="GtkLabel" id="label2">
+    <property name="label">Bla</property>
+  </object>
+</interface>
index e4e860fc9fad19d8affd069013141c35baa1c66f..6806ece0316ad523dbfafdcb2a98190eb5644502 100644 (file)
@@ -331,6 +331,8 @@ testdata = [
   # that are not valid with subpixel positioning
   #'label-wrap-justify.ref.ui',
   #'label-wrap-justify.ui',
+  'late-binding.ui',
+  'late-binding.ref.ui',
   'late-property.ui',
   'late-property.ref.ui',
   'letter-spacing.css',